/**
 * api 集合
 *
 * 暴露给外部使用 也可以在页面单独引用
 */
import axios from '@/utils/axios';
import qs from 'qs';

// 首页
import exampleApi from './modules/example.api';

// 合并所有模块api并导出到外部， 可直接在页面使用 this.$api.某某方法
const api = Object.assign(
    {},
    exampleApi,
);

const foreRequestMethod = (data, enableFilterEmpty) => {
    // 每个请求带上 token 和 时间戳
};

/**
 * api 统一封装方法
 * @description api集合为元数据，可直接在页面使用 this.$api.某某方法
 * @example api.requestExample(queryOrBodyData, enableFilterEmpty)
 *
 * @param {Object} queryOrBodyData? 查询参数 或者 荷载数据
 * @param {Boolean} enableFilterEmpty? 是否开启过滤空字段，默认 false
 *
 * @return {Object<{ data }>}
 */
export default new Proxy(api, {
    get: function (target, key) {
        if (!target[key]) throw new ReferenceError('API ' + key + ' not exist');

        let { method, url, failMsg, name } = target[key];

        // 过渡代码
        if (name) failMsg = name + '失败';

        if (method === 'GET') {
            return (query = {}) => new Promise((resolve, reject) => {
                foreRequestMethod(query);
                axios.get(url, { params: query })
                    .then(data => resolve(data))
                    .catch(err => {
                        console.error(failMsg + err.message);
                        reject(err);
                    });
            })
        }
        else if (method === 'POST') {
            return (body = {}) => new Promise((resolve, reject) => {
                foreRequestMethod(body);
                axios.post(url, qs.stringify(body))
                    .then(data => resolve(data))
                    .catch(err => {
                        console.error(failMsg + err.message);
                        reject(err);
                    });
            })
        }
        else {
            throw new Error('【API】API源数据信息错误，不支持的方法：' + method);
        }
    }
})
